
//完善学生宿舍信息管理系统

import java.util.Scanner;

public class NodeA {

    public class Friend {     // 定义朋友类，作为双向链表的节点
        public Friend next;   // 指向下一个节点的引用
        public Friend prev;   // 指向前一个节点的引用（双链表新增）
        private String Name;  // 姓名
        private String Tel;   // 电话号码
        private String Email; // 电子邮箱
        private String BornAdd; // 家庭住址

        public Friend(){}    // 无参构造方法，用于创建空节点

        public Friend(String Name, String Tel, String Email, String BornAdd){
            // 带参构造方法，初始化节点的各个属性
            this.Name = Name;
            this.Tel = Tel;
            this.Email = Email;
            this.BornAdd = BornAdd;
        }

        // 以下是各个属性的getter和setter方法
        public String getName(){
            return Name;
        }
        public void setName(String Name){
            this.Name = Name;
        }
        public void setTel(String Tel){
            this.Tel = Tel;
        }
        public String getTel(){   // 获取电话号码的方法
            return Tel;
        }
        public void setEmail(String Email){
            this.Email = Email;
        }
        public String getEmail(){
            return Email;
        }
        public void setBornAdd(String BornAdd){
            this.BornAdd = BornAdd;
        }
        public String getBornAdd(){
            return BornAdd;
        }
        public void message(String Name, String Tel, String Email, String BornAdd){
            this.Name = Name;
            this.Tel = Tel;
            this.Email = Email;
            this.BornAdd = BornAdd;
        }
        public String toString() {
            // 转换为字符串用于显示
            return this.Name + "\t" + this.Tel + "\t" + this.Email + "\t" + this.BornAdd;
        }
    }


    private int size;      // 记录链表中节点的数量
    private Friend head;   // 指向链表的头节点
    private Friend tail;   // 指向链表的尾节点（双链表新增）

    {
        // 初始化块，创建链表时执行
        this.size = 0;
        this.head = null;
        this.tail = null;  // 初始化尾节点引用（双链表新增）
    }

    public void insertHead(Friend s) {    // 头插法添加节点
        if (this.size == 0) {
            // 若链表为空，则新节点即为头节点也是尾节点
            this.head = s;
            this.tail = s;  // 设置尾节点（双链表新增）
            s.next = null;
            s.prev = null;  // 设置前驱为null（双链表新增）
        } else {
            // 若链表不为空，在头部插入新节点
            s.next = this.head;
            s.prev = null;      // 新节点的前驱为null（双链表新增）
            this.head.prev = s; // 原头节点的前驱指向新节点（双链表新增）
            this.head = s;
        }
        this.size++; // 节点数加1
    }


    public boolean delete(String Name) {   // 根据姓名删除联系人
        if (head == null) {
            return false; // 链表为空，无法删除
        }

        Friend current = this.head;

        // 处理头节点的情况
        if (Name.equals(current.getName())) {
            if (size == 1) {
                // 只有一个节点的情况
                head = null;
                tail = null;
            } else {
                // 删除头节点
                head = head.next;
                head.prev = null;
            }
            size--;
            return true;
        }

        // 处理中间节点的情况
        while (current.next != null) {
            current = current.next;
            if (Name.equals(current.getName())) {
                // 找到要删除的节点
                current.prev.next = current.next;
                if (current.next != null) {
                    current.next.prev = current.prev;
                } else {
                    // 如果是尾节点，更新tail
                    tail = current.prev;
                }
                size--;
                return true;
            }
        }

        return false; // 未找到要删除的节点
    }


    public Friend select(String Name) {   // 根据姓名查找联系人
        Friend current = this.head;
        while (current != null) {
            if (Name.equals(current.getName())) {
                // 找到匹配的联系人，创建并返回一个新的Friend对象
                Friend s = new Friend(Name, current.getTel(), current.getEmail(), current.getBornAdd());
                return s;
            }
            current = current.next;
        }
        return null; // 未找到匹配的联系人
    }


    public void display() {   // 显示所有联系人信息
        System.out.println("姓名\t手机号\t邮箱地址\t家庭住址");
        Friend current = this.head;
        while (current != null && current.getName() != null) {
            System.out.println(current.toString());
            current = current.next;
        }
        if (this.head == null || this.head.getName() == null) {
            System.out.println("无相关信息");
        }
    }


    public static void main(String[] args) {
        NodeA sm = new NodeA();
        Scanner in = new Scanner(System.in);
        boolean open = true;
        while (open) {
            printMenu();
            System.out.println("请输入菜单序号进行操作");
            int menu = -1;
            try {
                menu = in.nextInt();
            } catch (Exception e) {
                in = new Scanner(System.in);
            }
            switch (menu) {
                case 0: {
                    System.out.println("创建成功");
                }
                break;
                case 1: {
                    System.out.println("请输入姓名");
                    String Name1 = in.next();

                    System.out.println("手机号，邮箱地址，宿舍地址（空格结束，回车确认插入）");
                    try {
                        String Tel = in.next();
                        String Email = in.next();
                        String BornAdd = in.next();
                        Friend news = sm.new Friend(Name1, Tel, Email, BornAdd);
                        sm.insertHead(news);
                    } catch (Exception e) {
                        System.out.println("输入信息有误");
                        in = new Scanner(System.in);
                    }
                    break;
                }
                case 2: {
                    System.out.println("请输入要查询联系人的姓名");
                    String Name2 = in.next();
                    Friend selectS = sm.select(Name2);
                    System.out.println("姓名\t手机号\t邮箱地址\t宿舍地址");
                    if (selectS == null) {
                        System.out.println("未找到该联系人");
                    } else {
                        System.out.println(selectS.toString());
                    }
                }
                break;
                case 3: {
                    System.out.println("请输入要删除联系人的姓名");
                    String Name3 = in.next();
                    if (sm.delete(Name3)) {
                        System.out.println("删除成功");
                    } else {
                        System.out.println("删除失败");
                    }
                    sm.display();
                }
                break;
                case 4: {
                    sm.display();
                }
                break;
                case 5: {
                    System.out.println("系统已退出");
                    System.exit(0);
                    break;
                }
                default:
                    System.out.println("输入错误");
            }
        }
        in.close();
    }

    public static void printMenu() {
        System.out.println("24软件1班宿舍管理系统");
        System.out.println("*****************");
        System.out.println("* 0----创建链表   *");
        System.out.println("* 1----插入联系人 *");
        System.out.println("* 2----查找联系人 *");
        System.out.println("* 3----删除联系人 *");
        System.out.println("* 4----输出通讯录 *");
        System.out.println("* 5----退出系统   *");
        System.out.println("*****************");
        System.out.println("*本程序由P20240310029+梁欣设计并拥有全部代码版权*");
    }
}
